package com.sparrow.rpc.domain;

import java.lang.reflect.Method;
import java.util.Objects;

/**
 * RpcWrapper 类用于封装 RPC 方法的相关信息，
 * 包括方法对象、方法所属的对象实例以及方法的唯一键。
 * 该类提供了获取这些信息的公共方法，方便在 RPC 服务中使用。
 */
public class RpcWrapper {

    // 封装的方法对象
    private final Method method;
    // 方法所属的对象实例
    private final Object object;
    // 方法的唯一键
    private final String key;

    /**
     * 构造函数，用于初始化 RpcWrapper 对象。
     *
     * @param method 要封装的方法对象，不能为 null
     * @param object 方法所属的对象实例，不能为 null
     * @param key    方法的唯一键，不能为 null
     * @throws NullPointerException 如果传入的 method、object 或 key 为 null
     */
    public RpcWrapper(Method method, Object object, String key) {
        this.method = Objects.requireNonNull(method, "Method cannot be null");
        this.object = Objects.requireNonNull(object, "Object cannot be null");
        this.key = Objects.requireNonNull(key, "Key cannot be null");
    }

    /**
     * 获取封装的方法对象。
     *
     * @return 方法对象
     */
    public Method getMethod() {
        return method;
    }

    /**
     * 获取方法所属的对象实例。
     *
     * @return 对象实例
     */
    public Object getObject() {
        return object;
    }

    /**
     * 获取方法的唯一键。
     *
     * @return 方法的唯一键
     */
    public String getKey() {
        return key;
    }

    /**
     * 重写 toString 方法，方便调试和日志记录。
     *
     * @return 包含 RpcWrapper 信息的字符串
     */
    @Override
    public String toString() {
        return "RpcWrapper{" +
                "method=" + method.getName() +
                ", object=" + object.getClass().getName() +
                ", key='" + key + '\'' +
                '}';
    }

    /**
     * 重写 equals 方法，用于比较两个 RpcWrapper 对象是否相等。
     *
     * @param o 要比较的对象
     * @return 如果两个对象相等则返回 true，否则返回 false
     */
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        RpcWrapper that = (RpcWrapper) o;
        return method.equals(that.method) &&
                object.equals(that.object) &&
                key.equals(that.key);
    }

    /**
     * 重写 hashCode 方法，确保相等的对象具有相同的哈希码。
     *
     * @return 对象的哈希码
     */
    @Override
    public int hashCode() {
        return Objects.hash(method, object, key);
    }
}